package menus;

import bitclub.Articulo;
import herramientas.BitUtil;
import bitclub.Tarifa;
import java.util.List;

/**
 * @author BIT COMPANY
 */
public class OpcionesTarifas {

    /**
     * Crea un objeto tarifa pidiendo sus atributos y llamando al constructor
     * y después le da de alta en la base de datos
     */
    public static Tarifa opcionTarifasCrear() {
        Tarifa tarifa;
        BitUtil.borra();

        //Cogemos todos los datos uno a uno
        System.out.println("NUEVA TARIFA");
        System.out.println("____________________");
        String nombre = BitUtil.dameCadenaNoVacio("Nombre: ", 20);
        double alquiler = BitUtil.dameDoubleNoNegativo("Precio alquiler: ");
        int numDias = BitUtil.dameEnteroNoNegativo("Numero de dias de alquiler: ");
        double recargo = BitUtil.dameDoubleNoNegativo("Precio recargo: ");

        //Creamos la tarifa con todos los datos recopilados
        tarifa = new Tarifa(nombre, numDias, alquiler, recargo);

        //Borramos pantalla, mostramos la tarifa completa y pedimos confirmación
        BitUtil.borra();
        System.out.println(tarifa.toString());
        boolean confirmado = BitUtil.dameConfirmacion("Dar de alta esta tarifa? (s/n) ");

        //Si confirmamos pedimos al objeto que se guarde y si no lo descartamos
        if (confirmado) {
            tarifa.nuevo();
            return tarifa;
        } else {
            return null;
        }

    }

    /**
     * Ver datos de una tarifa
     * @param tarifa 
     */
    public static void opcionTarifasVer(Tarifa tarifa) {
        List<Articulo> listArticulo = Articulo.seleccionarPorTarifa(tarifa);
        BitUtil.borra();

        System.out.println(tarifa.toStringLinea());
        System.out.println(BitUtil.muestraSubrayado("Articulos con esta tarifa", "-"));

        int i=0;
        for (Articulo a : listArticulo) {
            System.out.println("- " + a.getTitulo() + " (" + a.getAno() + ")");
            if ((i + 1) % 15 == 0) {
                System.out.println("");
                BitUtil.esperaEnter();
                BitUtil.borra();
                System.out.println(tarifa.toStringLinea());
                System.out.println(BitUtil.muestraSubrayado("Articulos con esta tarifa", "-"));
            }
            i++;
        }
        System.out.println("");

        BitUtil.esperaEnter();
    }

    /**
     * Edita una tarifa una vez que se haya seleccionado
     * @param tarifa 
     */
    public static Tarifa opcionTarifasEditar(Tarifa tarifa) {
        int respuesta = 0;
        boolean algunCambio = false;
        BitUtil.borra();

        Tarifa copia = new Tarifa(tarifa.getNombre(), tarifa.getNumDias(), tarifa.getPrecio(),
                tarifa.getRecargo(), tarifa.getId());

        do {
            BitUtil.borra();
            respuesta = BitUtil.muestraMenu("EDITAR TARIFA", new String[]{"Nombre", "Precio Alquiler", "Num. Días", "Precio Recargo"});
            switch (respuesta) {
                case 1:
                    System.out.println("Nombre: " + tarifa.getNombre());
                    tarifa.setNombre(BitUtil.dameCadenaNoVacio("Nuevo Nombre: ", 30));
                    algunCambio = true;
                    break;
                case 2:
                    System.out.println("Precio Alquiler: " + BitUtil.muestraEuros(tarifa.getPrecio()));
                    tarifa.setPrecio(BitUtil.dameDoubleNoNegativo("Nuevo Precio Alquiler? "));
                    algunCambio = true;
                    break;
                case 3:
                    System.out.println("Núm Dias: " + tarifa.getNumDias());
                    tarifa.setNumDias(BitUtil.dameEnteroNoNegativo("Nuevo numero de dias? "));
                    algunCambio = true;
                    break;
                case 4:
                    System.out.println("Precio Recargo: " + BitUtil.muestraEuros(tarifa.getRecargo()));
                    tarifa.setPrecio(BitUtil.dameDoubleNoNegativo("Nuevo Precio Recargo? "));
                    algunCambio = true;
                    break;
            }
        } while (respuesta != 0);

        if (algunCambio) {
            BitUtil.borra();
            System.out.println(tarifa.toString());
            System.out.println("\n");
            boolean confirmar = BitUtil.dameConfirmacion("Desea guardar estos cambios? (S/N) ");
            if (confirmar) {
                tarifa.actualizar();
            } else {
                //Si no aceptamos los cambios debemos recuperar el objeto sin cambios
                return copia;
            }
        }
        return tarifa;
    }

    /**
     * Elimina la tarifa seleccionada
     * @param tarifa 
     */
    public static boolean opcionTarifasEliminar(Tarifa tarifa) {
        boolean borra;
        boolean enUso = true;
        borra = BitUtil.dameConfirmacion("Quiere eliminar la tarifa? (S/N) ");
        if (borra) {
            enUso = Tarifa.existeTarifaEnArticulo(tarifa.getId());
            if (enUso) {
                System.out.println("No se puede eliminar Tarifa ya que está en uso actualmente");
                BitUtil.esperaEnter();
            } else {
                tarifa.eliminar();
                System.out.println("La tarifa ha sido eliminada.");
                BitUtil.esperaEnter();
            }
        }
        return enUso;
    }

    /**
     * Nos permite seleccionar un empleado
     * ((probablemente no haya tantos empleados como para hacer una búsqueda))
     * PRINCIPAL > EMPLEADOS > BUSCAR
     */
    public static Tarifa seleccionarTarifa() {
        return seleccionarTarifa(true);
    }

    public static Tarifa seleccionarTarifa(boolean muestraSalir) {
        Tarifa tarifa = null;
        String nombre;
        int respuesta;

        do {
            BitUtil.borra();
            nombre = "";
            if (muestraSalir) {
                respuesta = BitUtil.muestraMenu("Seleccion de Tarifa", new String[]{"Por codigo", "Por Nombre", "Todas"}, "No seleccionar ninguna");
            } else {
                respuesta = BitUtil.muestraMenu("Seleccion de Tarifa", new String[]{"Por codigo", "Por Nombre", "Todas"}, "");
            }
            switch (respuesta) {
                case 1:
                    int id = BitUtil.dameEntero("Codigo: ");
                    tarifa = Tarifa.seleccionarPorId(id);
                    if (tarifa == null) {
                        BitUtil.borra();
                        System.out.println(BitUtil.muestraSubrayado("Seleccion de Tarifa", "-") + "\n");
                        System.out.println("No hay tarifas con dicho criterio.\n");
                        BitUtil.esperaEnter();
                    } else {
                        respuesta = 0;
                    }
                    break;
                case 2:
                    BitUtil.borra();
                    System.out.println(BitUtil.muestraSubrayado("Seleccion de Tarifa", "-") + "\n");
                    nombre = BitUtil.dameCadena("Introduzca nombre: ", 20);
                case 3:
                    List<Tarifa> listTarifa = Tarifa.seleccionarPorNombre(nombre);
                    if (listTarifa.isEmpty()) {
                        BitUtil.borra();
                        System.out.println(BitUtil.muestraSubrayado("Seleccion de Tarifa", "-") + "\n");
                        System.out.println("No hay tarifas con dicho criterio.\n");
                        BitUtil.esperaEnter();
                    } else {
                        String[] opciones = new String[listTarifa.size()];
                        for (int i = 0; i < listTarifa.size(); i++) {
                            opciones[i] = listTarifa.get(i).getNombre() + " (" + BitUtil.muestraEuros(listTarifa.get(i).getPrecio()) + " por " + listTarifa.get(i).getNumDias() + " dias + " + BitUtil.muestraEuros(listTarifa.get(i).getRecargo()) + " por dia extra)";
                        }
                        BitUtil.borra();
                        int seleccion = BitUtil.muestraMenu("Seleccion de Tarifa", opciones);
                        if (seleccion != 0) {
                            tarifa = listTarifa.get(seleccion - 1);
                            respuesta = 0;
                        }
                    }
                    break;
            }
        } while (respuesta != 0);
        return tarifa;
    }
}
